<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        /* 
            es6中新增了对象创建的语法糖，支持了class extend constructor等关键字，让es6的语法和面向对象的语法更加接近
        */
       class Person1{
            // 属性
            n;
            age;

            get name() {
                console.log("getter")
                return this.n
            }

            set name(name) {
                this.n = name
            }

            eat(food) {
                console.log(this.age + "岁的" + this.n + "用筷子吃" + food)
            }

            // 静态方法
            static sum(a, b) {
                return a+b
            }

            // 构造器
            constructor(name, age) {
                this.n = name
                this.age = age
            }
       }
       let person = new Person1("张三", 20)
       // 当类的属性就叫name时，person.name走的是属性，当类的属性不是name而是n，走的是get方法，因为get方法的方法名与person.name的name一致
       console.log(person.name) 
   

       // 私有属性测试
       class Person2{
            // 属性
            #n; // "#"表示该属性是私有的，不能通过.属性直接获取，需要通过getter方法获取
            age;

            get name() {
                console.log("getter")
                return this.#n
            }

            set name(name) {
                this.#n = name
            }

            eat(food) {
                console.log(this.age + "岁的" + this.#n + "用筷子吃" + food)
            }

            // 静态方法
            static sum(a, b) {
                return a+b
            }

            // 构造器
            constructor(name, age) {
                this.#n = name
                this.age = age
            }
       }
       let person2 = new Person2("小明", 20)
    //    console.log(person2.#n) // 编译直接报错，私有属性不能直接访问
       console.log(person2.name) // 通过getter方法访问私有属性


       // 继承性测试
       class Student extends Person2{
        score;
        study() {
            console.log(`${this.age}岁的${this.name}考了${this.score}分`)
        }
        constructor (name, age, score) {
            super(name, age)
            this.score = score
        }
       }
       let student = new Student("小红", 22, 100)
       student.study()
    </script>
</head>
<body>
    
</body>
</html>